
/*
工厂模式

意图:定义一个创建对象的接口，让其子类自己决定实例化哪一个工厂类，
工厂模式使其创建过程延迟到子类进行。
主要解决:主要解决接口选择的问题。
何时使用:我们明确地计划不同条件下创建不同实例时。
如何解决:让其子类实现工厂接口，返回的也是一个抽象的产品。
关键代码：创建过程在其子类执行。

注意:复杂对象创建使用工厂模式,简单对象使用工厂模式增加复杂度

详细介绍:(https://www.runoob.com/design-pattern/factory-pattern.html)
*/


public class FactoryPattern{
	public static void main(String[] args) {
		// 步骤4

		ShapeFactory sf = new ShapeFactory();

		Shape s1 = sf.getShape("CIRCLE");
		s1.draw();

		Shape s2 = sf.getShape("RECTANGLE");
		s2.draw();

		Shape s3 = sf.getShape("SQUARE");
		s3.draw();

	}
}


// 步骤1
interface Shape{
	void draw();
}

// 步骤2
class Rectangle implements Shape{
	@Override
	public void draw(){
		System.out.println("Rectangele::draw()");
	}
}

class Square implements Shape{
	@Override
	public void draw(){
		System.out.println("Square::draw()");
	}
}

class Circle implements Shape{
	@Override
	public void draw(){
		System.out.println("Circle::draw()");
	}
}
// 步骤3
class ShapeFactory{
	public Shape getShape(String shapeType){
		if (shapeType == null) {
			return null;
		}
		if (shapeType.equalsIgnoreCase("CIRCLE")) {
			return new Circle();
		}

		if (shapeType.equalsIgnoreCase("RECTANGLE")) {
			return new Rectangle();
		}

		if (shapeType.equalsIgnoreCase("SQUARE")) {
			return new Square();
		}
		return null;
	}
}
